/*
 *  Copyright 2019-2025 Zheng Jie
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package me.zhengjie.modules.bailian.rest;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.Log;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.bailian.domain.EosSystemFunctionDescription;
import me.zhengjie.modules.bailian.domain.dto.EosSystemFunctionDescriptionQueryCriteria;
import me.zhengjie.modules.bailian.service.EosSystemFunctionDescriptionService;
import me.zhengjie.utils.PageResult;
import me.zhengjie.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @author Yaco
 * @date 2025-03-17
 **/
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "Eos系统功能使用说明")
@RequestMapping("/api/eosSystemFunctionDescription")
public class EosSystemFunctionDescriptionController {

    @Value("${app.config.bid}")
    private String businessSpaceId;

    @Value("${app.config.cid}")
    private String categoryId;

    @Value("${app.config.data_structure_type}")
    private String structureType;

    private final EosSystemFunctionDescriptionService eosSystemFunctionDescriptionService;

    @ApiOperation("导出数据")
    @GetMapping(value = "/download")
    @PreAuthorize("@el.check('eosSystemFunctionDescription:list')")
    public void exportEosSystemFunctionDescription(HttpServletResponse response, EosSystemFunctionDescriptionQueryCriteria criteria) throws IOException {
        eosSystemFunctionDescriptionService.download(eosSystemFunctionDescriptionService.queryAll(criteria), response);
    }

    @GetMapping
    @ApiOperation("查询Eos系统功能使用说明")
    @PreAuthorize("@el.check('eosSystemFunctionDescription:list')")
    public ResponseEntity<PageResult<EosSystemFunctionDescription>> queryEosSystemFunctionDescription(EosSystemFunctionDescriptionQueryCriteria criteria) {
        Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
        return new ResponseEntity<>(eosSystemFunctionDescriptionService.queryAll(criteria, page), HttpStatus.OK);
    }

    @PostMapping
    @Log("新增Eos系统功能使用说明")
    @ApiOperation("新增Eos系统功能使用说明")
    @PreAuthorize("@el.check('eosSystemFunctionDescription:add')")
    public ResponseEntity<Object> createEosSystemFunctionDescription(@Validated @RequestBody EosSystemFunctionDescription resources) {
        long start = System.currentTimeMillis();
//        resources = new EosSystemFunctionDescription();
        // ### 新增Eos系统功能使用说明 : {
        //sql- 2025-03-17 14:37:04 [Time: 11ms] - SELECT COUNT(*) AS total FROM eos_system_function_description;
        //    "tag1": "EOS",
        //    "tag2": "安灯",
        //    "tag3": "安灯·系统总体功能",
        //    "knowledgeTopic": "安灯·登录·系统角色·语言版本",
        //    "knowledgeSliceInitial": "1. 访问终端\nEOS 系统支持多终端访问，包括 PC、平板电脑和移动设备，以满足不同场景下的使用需求。\n2. EOS 系统的角色\nEOS 系统的用户角色主要分为班组长和非班组长两类：\n班组长：负责生产现场管理的人员，包括一线主管或生产管理人员。\n非班组长：包括维修工程师、现场支持人员及各级主管和经理等。不同角色登录系统后，可访问不同的页面，并执行相应的操作。\n3. 多语言支持\nEOS 系统提供多语言版本，以支持跨国企业和希望拓展国际市场的企业在全球范围内同步部署。目前支持以下语言：\n中文（简体、繁体）\n英语\n法语\n西班牙语\n捷克语\n俄语\n阿拉伯语\n若客户有额外的语言需求，可快速增加相应的语言支持。\n4. 系统登录\n由于 EOS 系统属于企业内部系统，采用封闭式登录机制。管理员需在后台预先配置用户账号，用户方可登录系统。\n用户可通过以下三种方式之一进行登录：\n工号\n邮箱\n手机号\n在登录界面，输入用户名和密码完成身份验证。\n5. 班组长角色的登录流程\n以班组长角色登录系统后，用户需确认其负责的生产线及相关信息。班组长作为生产现场的直接负责人，系统要求其绑定至对应的生产线。\n成功进入系统后，班组长可访问以下五个主要功能模块：\n1.看板：提供生产过程的可视化信息。\n2.停机：用于记录和管理生产线停机事件。\n3.产量：跟踪生产任务的完成情况。\n4.质量：监测产品质量数据和异常情况。\n我的：提供个性化设置及相关任务管理。",
        //    "metadataResponseMethod": "知识库+Prompt"
        //}
        /**
         * TODO
         * 1. 根据knowledge_topic查询,数据是否存在
         * 2. knowledgeSliceInitial处理成最终版,调用千问Max处理
         * 3. 记录插入数据库
         */
        // No.1
        EosSystemFunctionDescriptionQueryCriteria criteria = new EosSystemFunctionDescriptionQueryCriteria();
        criteria.setKnowledgeTopic(resources.getKnowledgeTopic());
        List<EosSystemFunctionDescription> eosSystemFunctionDescriptions = eosSystemFunctionDescriptionService.queryAll(criteria);
        // 存在重复记录,终止处理
        if (CollUtil.isNotEmpty(eosSystemFunctionDescriptions)) {
            throw new BadRequestException("重复录入");
        }
//        // No.2
        // 不存在重复记录,正常录入
        resources.setBusinessSpaceId(businessSpaceId);
        resources.setCategoryId(categoryId);
        resources.setFileType("EOS_1");
        resources.setFileIndex(0);
        resources.setFileVersion(1);
        resources.setProcessState("0");
        resources.setApprovalStatus("0");
        resources.setOperatorUserId(SecurityUtils.getCurrentUserId());
        eosSystemFunctionDescriptionService.create(resources);

        // 初始化数据库
//        ExcelReader reader = ExcelUtil.getReader(FileUtil.file("/Users/luyou/Downloads/doc003.xlsx"), 0);
//        List<EosSystemFunctionDescription> excelRows = reader.readAll(EosSystemFunctionDescription.class);
//        int i = 1;
//        for (EosSystemFunctionDescription row : excelRows) {
//            log.info(" ### 处理第{}行", i);
//            row.setBusinessSpaceId(businessSpaceId);
//            row.setCategoryId(categoryId);
//            // 同步知识库状态
//            row.setProcessState("1");
//            // 文档类型
//            row.setFileType("EOS_1");
//            row.setFileIndex(i);
//            // 初始化版本号1
//            row.setFileVersion(1);
//            // 审批状态,待审批
//            row.setApprovalStatus("1");
//            row.setKnowledgeSliceInitial(row.getKnowledgeSliceFinal());
//            row.setOperatorUserId(SecurityUtils.getCurrentUserId());
//            eosSystemFunctionDescriptionService.create(row);
//            i++;
//        }
        log.info(" ### 全部处理成功, 耗时: {}ms", (System.currentTimeMillis() - start));
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

    @PutMapping
    @Log("修改Eos系统功能使用说明")
    @ApiOperation("修改Eos系统功能使用说明")
    @PreAuthorize("@el.check('eosSystemFunctionDescription:edit', 'eosSystemFunctionDescription:approve')")
    public ResponseEntity<Object> updateEosSystemFunctionDescription(@Validated @RequestBody EosSystemFunctionDescription resources) {
        // TODO 加锁,避免与任务并行执行
        boolean startTask = false;
        if (StrUtil.isNotBlank(resources.getOptCodes()) && "approve".equalsIgnoreCase(resources.getOptCodes())) {
            // 审核通过, 标记启动同步任务
            if ("1".equals(resources.getApprovalStatus())) {
                startTask = true;
            }
            // 设置审核人员ID
            resources.setApprovalUserId(SecurityUtils.getCurrentUserId());
        } else {
            // 非审核修改,审核状态变更为待审核
            resources.setApprovalStatus("0");
        }
        // 只要修改, 就变更同步知识库状态
        resources.setProcessState("0");
        eosSystemFunctionDescriptionService.update(resources);
        if (startTask) {
            log.info(" ### 审核成功, 触发知识库同步任务!");
            eosSystemFunctionDescriptionService.task(structureType, resources);
        }
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    /*@PutMapping
    @Log("复核Eos系统功能使用说明")
    @ApiOperation("复核Eos系统功能使用说明")
    @PreAuthorize("@el.check('eosSystemFunctionDescription:approve')")
    public ResponseEntity<Object> approveEosSystemFunctionDescription(@Validated @RequestBody EosSystemFunctionDescription resources) {
        // TODO 加锁,避免与任务并行执行
        eosSystemFunctionDescriptionService.update(resources);
        if (resources.getApprovalStatus() != null && "1".equals(resources.getApprovalStatus())) {
            // 复核成功
            log.info(" ### 复核成功, 触发知识库同步");
            eosSystemFunctionDescriptionService.task();
        }
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }*/

    @DeleteMapping
    @Log("删除Eos系统功能使用说明")
    @ApiOperation("删除Eos系统功能使用说明")
    @PreAuthorize("@el.check('eosSystemFunctionDescription:del')")
    public ResponseEntity<Object> deleteEosSystemFunctionDescription(@ApiParam(value = "传ID数组[]") @RequestBody List<Integer> ids) {
        eosSystemFunctionDescriptionService.deleteAll(ids);
        return new ResponseEntity<>(HttpStatus.OK);
    }

    // eosSystemFunctionDescription:approve 审核权限
}
